package com.shujia.scala

object Demo6Base {
  def main(args: Array[String]): Unit = {
    // 单行注释
    /**
     * 多行注释 一般用于文档
     */
    // 变量 : 命名规范参考Java的，大小写字母、数字、下划线，不能以数字开头，不能关键字
    // 可以分为两类： val var
    // 一般情况下 能使用val的情况下尽量使用val
    val a = 1 // val 修饰的变量 不可以进行修改(不可以重新赋值或者重新引用)
    println(a)
    //    a = 0 // 不能修改 这是错误的
    var b = 2 // var 修饰的变量 可以进行修改(重新赋值或者重新引用)
    b = 3 // 这是可以的
    // 变量的类型会自动推断
    // 定义变量的时候实际上是可以指定类型的
    val c: Int = 20

    // 数据类型
    val byte: Byte = 10
    val short: Short = 100
    val int: Int = 1000
    val long: Long = 100000L
    val float: Float = 1.1f
    val double: Double = 1.2
    val bool: Boolean = true
    val bool2: Boolean = false
    val char: Char = 'c'

    // 引用类型
    // scala中的String实际上是Java中的
    // 在scala会给String加上很多新的方法(隐式转换)
    val str: String = "abcdefg"

    // 拼接字符串
    val name = "张三"
    val age = 20
    val clazz = "文科一班"
    // 直接加
    val str3 = name + "," + age + "," + clazz
    println(str3)
    // 通过StringBuilder 效率会好一点
    val str4 = new StringBuilder()
    str4.append(name)
    str4.append(",")
    str4.append(age)
    str4.append(",")
    str4.append(clazz)
    println(str4)
    // scala中的方式
    val str5 = s"${name},${age},${clazz}"
    println(str5)

    // 类型转换
    // 只要保证数据是符合规范的 就可以直接to类型直接转换
    val str2: String = "123456"
    val int1: Int = str2.toInt
    val int2: Long = str2.toLong

    // Any:是所有类型的基类 相当于Java中的Object
    // Any下面有两个子类分别是：AnyRef、AnyVal
    val anyRef: AnyRef = "abc" // AnyRef 表示所有引用类型的基类
    val anyVal: AnyVal = 1 // AnyVal 表示所有值类型的基类

    // 算术运算符 + - * / %
    println(2 * 3)
    println("#" * 20) // 表示输出20个# 这里的 * 不是算数运算符

    // 关系运算符 > < == >= <= !=

    // 位运算符 ~按位取反 &按位与 |按位或 ^异或

    // 循环
    // for while
    // for 没有Java中的 for(int i = 0;i<10;i++){}
    // for 同Java中的for each类似 主要用于遍历数据容器

    // 循环主要用while
    // 计算1~100的和
    var i = 1
    var sum = 0
    while (i <= 100) {
      sum += i
      i += 1 // scala中没有++ --
    }
    println(sum)

    println("#" * 20)

    // do while
    do {
      println("do while 循环体至少会执行一次")
    } while (100 > 200)

    println("#" * 20)

    // 定义了一个List
    val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
    for (elem: Int <- list) { // 相当于Java的for each 写法不一样而已
      println(elem)
    }
    // 计算1~100的和
    var sum2 = 0
    for (i <- 1 to 100) { // i 相当于 1~100
      sum2 += i
    }
    println(sum2)
    var sum3 = 0
    for (i <- 1 until 100) { // i 相当于 1~100
      sum3 += i
    }
    println(sum3)
    println("#" * 20)
    // Range函数(起始位置,结束位置,步长)
    // 按照步长生成一个包含起始位置不包含结束位置的序列
    for (i <- Range(1, 10, 2)) {
      print(i + " ")
    }
    println()
    println("#" * 20)

    // 输出1~10的奇数
    for (i <- 1 to 10 if i % 2 == 1) {
      println(i)
    }
    // if -else if- else 选择结构 同Java一致
    val nianLing = 20
    if (nianLing >= 18) {
      println("成年")
    } else if (nianLing >= 0 && nianLing < 18) {
      // && 与
      // || 或
      // ! 非
      println("未成年")
    } else {
      println("年龄不能为负数")
    }


  }
}
